//赎金信
/*给你两个字符串：ransomNote 和 magazine ，判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以，返回 true ；否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

 */
 class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        int hash1[26] = {0};
        int hash2[26] = {0};
        for (auto& c : magazine) {
            hash1[c - 'a']++;
        }
        for (auto& c : ransomNote) {
            int temp = c - 'a';
            hash2[temp]++;
            if (hash2[temp] > hash1[temp])
                return false;
        }
        return true;
    }
};



//同构字符串
/*给定两个字符串 s 和 t ，判断它们是否是同构的。

如果 s 中的字符可以按某种映射关系替换得到 t ，那么这两个字符串是同构的。

每个出现的字符都应当映射到另一个字符，同时不改变字符的顺序。不同字符不能映射到同一个字符上，相同字符只能映射到同一个字符上，字符可以映射到自己本身。*/
class Solution {
public:
    bool isIsomorphic(string s, string t) {
        unordered_map<char, char> hash1;
        unordered_map<char, char> hash2;
        for (int i = 0; i < s.size(); i++) {
            if (hash1.count(s[i])) {
                if (hash1[s[i]] != t[i])
                    return false;
            } else
                hash1[s[i]] = t[i];
            if (hash2.count(t[i])) {
                if (hash2[t[i]] != s[i])
                    return false;
            } else
                hash2[t[i]] = s[i];
        }
        return true;
    }
};